package com.itfenghuang.day06;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Objects;

public class A02_泛型 {
    public static void main(String[] args) {
        /**
         * 1.概念
         *      目的: 就是为了在集合中使用泛型,以后看源码知道是个啥东西
         *      泛型:参数化类型,像传递参数一样使用泛型
         * 2.优点
         *      避免进行类型强转
         * 3.泛型分类
         *      泛型类:
         *              格式: 修饰符  class 类名<引用数据类型> {}
         *              类型: P  E
         *      泛型方法:
         *              格式:  修饰符<类型> 返回值类型 方法名(类型,变量名){}
         *      泛型接口:
         *              格式:  修饰符 interface 接口名<T>{
         *                  void print(T t);
         *              }
         * 4.类型通配符
         *      泛型的下限:
         *          格式:  <? super 类型名>
         *                表示一个范围:  表示可以传递的类型是该类型及其父类
         *      泛型的上限:
         *          格式: <? extends 类型名>
         *                表示一个范围:  类型名及其子类
         *
         */
//        ArrayList<Object> objects = new ArrayList<>();
//        ArrayList<Integer> integers = new ArrayList<>();
//        LinkedList<Object> objects1 = new LinkedList<>();

        A<Object> a= new A<>();
        a.method(123);
        a.method("爆爆");


           ArrayList<String> list = new ArrayList<>();
           list.add("aaa");
           list.add("bbb");
           list.add("ccc");
           list.add("aaa");
           list.add("aaa");
//        System.out.println(list);


        method(list);
        System.out.println("==================");
        method1(list);
    }
    //遍历集合方法
    //测试泛型下限
    public static void method(ArrayList<? super String> arrayList){
        for (Object o : arrayList) {
            System.out.println(o);
        }
    }
    //测试泛型上限
    public static void method1(ArrayList<? extends Object> arrayList){
        for (Object o : arrayList) {
            System.out.println(o);
        }
    }

}
class A<T>{
    //泛型方法
    //尖括号中字母表示的类型要和方法参数的类型一致
    public<T> void method(T t){
        System.out.println("泛型方法"+t);
    }
}

interface  B<T>{

  void print(T t);
}
class C implements B<String>{

    @Override
    public void print(String s) {

    }
}

